#include "gpio.h"


/*
 * 功能：gpio引脚初始化的函数
 * 		初始化函数解析函数传递的实参值完成对引脚的初始化
 * 参数： 
 * 	@ gpios : 哪组GPIO引脚
 * 	@ init : 引脚初始化结构体
 * 返回值：无
 * */
void hal_gpio_init(gpio_t *gpios, gpio_init_t *init)
{
	// 一次只可以初始化一个引脚
	// 0. 获取引脚的编号
	unsigned int i;
	unsigned int pin_num;
	for (i = 0; i < 16; i++) {
		if (init->pin & (0x1 << i)) {
			pin_num = i;
			break;
		}
	}

	// 1. 设置引脚的模式
	gpios->MODER &= (~(0x3 << (pin_num * 2)));
	gpios->MODER |= (init->mode << (pin_num * 2));
	// 2. 设置引脚的类型
	gpios->OTYPER &= (~(0x1 << pin_num));
	gpios->OTYPER |= (init->type << pin_num);
	// 3. 设置引脚的速度
	gpios->OSPEEDR &= (~(0x3 << (pin_num * 2)));
	gpios->OSPEEDR |= (init->speed << (pin_num *2));
	// 4. 设置引脚的上拉和下拉
	gpios->PUPDR &= (~(0x3 << (pin_num * 2)));
	gpios->PUPDR |= (init->pupd << (pin_num * 2));
}
// 功能： 设置gpio引脚输出高低电平
// 参数：
// 	@ gpios ： GPIO引脚的组
// 	@ pin : 那个gpio引脚
// 	@ statu: 引脚的输出状态
// 返回值：无
void hal_gpio_write(gpio_t *gpios, 
			unsigned int pin, gpio_status_t statu)
{
	// 控制led灯输出高低电平
	if (statu == GPIO_RESET) {
		gpios->ODR &= ~pin;
	} else {
		gpios->ODR |= pin;
	}
}

// 功能： 检测gpio引脚输入高低电平
// 参数：
// 	@ gpios ： GPIO引脚的组
// 	@ pin : 那个gpio引脚
// 返回值：引脚的输入的的状态
gpio_status_t hal_gpio_read(gpio_t * gpios, 
		unsigned int pin)
{
	if (gpios->IDR & pin) {
		return GPIO_SET;
	} else {
		return GPIO_RESET;
	}
}
